/**
 * 文件名：@BeanInvoker.java <br/>
 * 包名：cn.efunbox.afw.core.invocation <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.invocation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import cn.efunbox.afw.core.exception.SystemException;
import cn.efunbox.afw.core.mvc.context.Context;

/**
 * 类名：BeanInvoker  <br />
 *
 * 功能：使用jdk的反射机制执行bean的方法
 *
 * @author xtwin <br />
 * 创建时间：2015年12月3日 下午1:39:14  <br />
 * @version 2015年12月3日
 */
public class ReflectMethodInvoker implements Invoker {
	
	// 目标bean
	private Object bean;
	
	// 目标方法
	private Method method;
	
	
	/**
	 * 构造方法
	 */
	public ReflectMethodInvoker(Object bean, Method method) {
		this.bean = bean;
		this.method = method;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 下午1:39:25<br/>
	 * 
	 * @param context
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.invocation.Invoker#invoke(cn.efunbox.afw.core.mvc.context.Context)
	 */
	@Override
	public Object invoke(Context context) throws Exception {
		// 使用反射机制执行
		try {
			return method.invoke(bean, context);
		} catch (InvocationTargetException e) {
			// 异常处理
			Throwable exp = e.getTargetException();
			if (exp instanceof Exception) {
				throw (Exception) exp;
			} else {
				throw new SystemException(exp.getMessage());
			}
		}
	}

	/**
	 * @version 2015年12月3日-下午1:41:51
	 */
	public Object getBean() {
		return bean;
	}

	/**
	 * @version 2015年12月3日-下午1:41:51
	 */
	public Method getMethod() {
		return method;
	}
}
